package pe.com.pgn.consolidadorventas.servidorcentral.dbo.factory;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import pe.com.pgn.consolidadorventas.servidorcentral.dbo.Archivo;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVenta;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaDetalle;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpBonus;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpDocAnti;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpSalesCard;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaDetalle;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaDocAnti;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaOpBonus;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaPrincipal;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaSalesCard;

public class GlpDboFactory {
	
	static Logger logger = Logger.getLogger(GlpDboFactory.class);

	static String fechaHora = "dd/MM/yyyy HH:mm:ss";
	
	static String numeroNulo = "0.0";
	
	public static GlpVenta generarDboGlpVenta(Archivo a,GlpRegistroVentaPrincipal principal){
		SimpleDateFormat formato = new SimpleDateFormat(fechaHora);
		GlpVenta v = new GlpVenta();
		v.setIdArchivo(a.getIdArchivo());
		v.setDocTypeId(principal.getDocTypeId());
		v.setNbrDocument(principal.getNbrDocument());
		v.setSiteId(principal.getSiteId());
		v.setTypePaymentId(principal.getTypePaymentId());
		v.setStkInventory(principal.getStkInventory());
		v.setDocStatusId(principal.getDocStatusId());
		v.setTermId(principal.getTermId());
		v.setSalesPerId(principal.getSalesPerId());
		v.setUserId(principal.getUserId());
		
		try {
			v.setDateDoc(formato.parse(principal.getDateDoc()));
		} catch (ParseException e) {
			logger.error("Error colocando datedoc en venta principal del archivo "+a.getIdArchivo()+" ("+e.getMessage()+")");
		}
		
		try {
			v.setDateProceSales(formato.parse(principal.getDateProceSales()+" 00:00:00"));
		} catch (ParseException e) {
			logger.error("Error colocando dateProceSales en venta principal del archivo "+a.getIdArchivo()+" ("+e.getMessage()+")");
		}
		
		v.setPerPost(principal.getPerPost());
		
		try{
			v.setTotalPen(new BigDecimal(principal.getTotalPen().trim()));			
		}catch(Exception e){
			v.setTotalPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor TotalPen , se seteo el valor por defecto ("+numeroNulo+") : "+e.getMessage());
		}
		
		try{
			v.setSubTotalPen(new BigDecimal(principal.getSubTotalPen().trim()));			
		}catch(Exception e){
			v.setSubTotalPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor SubtotalPen , se seteo el valor por defecto ("+numeroNulo+") : "+e.getMessage());
		}
		
		try{
			v.setTaxIgvPen(new BigDecimal(principal.getTaxIgvPen().trim()));			
		}catch(Exception e){
			v.setTaxIgvPen(new BigDecimal(numeroNulo));	
			logger.error("Error seteando el valor taxigvpen , se seteo el valor por defecto ("+numeroNulo+") : "+e.getMessage());
		}
		
		try{
			v.setTotCashPen(new BigDecimal(principal.getTotCashPen().trim()));			
		}catch(Exception e){
			v.setTotCashPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor totcashpen , se seteo el valor por defecto ("+numeroNulo+") : "+e.getMessage());
		}
			
		v.setCustIdss(principal.getCustIdss());
		
		v.setTaxRegnBr(principal.getTaxRegnBr());
		v.setPlaca(principal.getPlaca());
		v.setNbrBonus(principal.getNbrBonus());
		v.setSalesPoint(principal.getSalesPoint());
		
		try{
			v.setKilometraje(new BigDecimal(principal.getKilometraje().trim()));			
		}catch(Exception e){
			v.setKilometraje(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor kilometraje , se seteo el valor por defecto ("+numeroNulo+") : "+e.getMessage());
		}
		
		v.setBusinessType(principal.getBusinessType());
		v.setUser9(principal.getUser9());
		v.setCustName(principal.getCustName());
		v.setFilaVenDet(principal.getFilaVenDet());
		v.setFilaVenSal(principal.getFilaVenSal());
		v.setFilaVenDoc(principal.getFilaVenDoc());
		v.setFilaVenBon(principal.getFilaVenBon());
		
		try{
			v.setChkVenDet(new BigDecimal(principal.getChkVenDet().trim()));			
		}catch(Exception e){
			v.setChkVenDet(new BigDecimal(numeroNulo));	
			logger.error("Error seteando el valor chkvendet , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		try{
			v.setChkVenSal(new BigDecimal(principal.getChkVenSal().trim()));			
		}catch(Exception e){
			v.setChkVenSal(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor chkvensal , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		return v;
	}
	
	public static List<?> generarListaDbo(GlpVenta vta,List<?> listaDatos,int tipoDato){
		List<Object> listaDbo = new ArrayList<Object>();
		if(listaDatos!=null){
			int limite = listaDatos.size();
			for(int i=0;i<limite;i++){
				switch(tipoDato){
					case 2:{ 
						GlpRegistroVentaDetalle dato = (GlpRegistroVentaDetalle)listaDatos.get(i);
						GlpVentaDetalle dboVentaDetalle = generarDboGlpVentaDetalle(vta,dato);
						listaDbo.add(dboVentaDetalle);
						break;
					}
					
					case 3:{
						GlpRegistroVentaSalesCard dato = (GlpRegistroVentaSalesCard)listaDatos.get(i);
						GlpVentaOpSalesCard dboVentaSalesCard = generarDboGlpVentaOpSalesCard(vta,dato);
						listaDbo.add(dboVentaSalesCard);
						break;
					}
					
					case 4:{
						GlpRegistroVentaDocAnti dato = (GlpRegistroVentaDocAnti)listaDatos.get(i);
						GlpVentaOpDocAnti dboVentaOpDocAnti = generarDboGlpVentaOpDocAnti(vta,dato);
						listaDbo.add(dboVentaOpDocAnti);
						break;
					}
					
					case 5:{
						GlpRegistroVentaOpBonus dato = (GlpRegistroVentaOpBonus)listaDatos.get(i);
						GlpVentaOpBonus dboVentaOpBonus = generarDboGlpVentaOpBonus(vta,dato);
						listaDbo.add(dboVentaOpBonus);
						break;
					}
				}

			}
		}
		return listaDbo;
	}
	
	public static GlpVentaDetalle generarDboGlpVentaDetalle(GlpVenta vta,GlpRegistroVentaDetalle dt){
		SimpleDateFormat formato = new SimpleDateFormat(fechaHora);
		GlpVentaDetalle d = new GlpVentaDetalle();
		d.setIdVenta(vta.getIdVenta());
		d.setDocTypeId(dt.getDocTypeId());
		d.setNbrDocument(dt.getNbrDocument());
		d.setSiteId(dt.getSiteId());
		
		try{
			d.setSequence(Integer.parseInt(dt.getSequence()));
		}catch(NumberFormatException nfe){
			d.setSequence(-1);
			logger.error("Error colocando sequence en detalle para la venta "+vta.getIdVenta()+" ("+nfe.getMessage()+")");
		}
		
		try{
			d.setInvtidsku(Integer.parseInt(dt.getInvtidsku()));
		}catch(NumberFormatException nfe){
			d.setInvtidsku(-1);
			logger.error("Error colocando invtidsku en detalle para la venta "+vta.getIdVenta()+" ("+nfe.getMessage()+")");
		}
		
		d.setDocStatusId(dt.getDocStatusId());
		
		try {
			d.setDateDoc(formato.parse(dt.getDateDoc()));
		} catch (ParseException e) {
			logger.error("Error colocando fecha 'dateDoc' en detalle para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		
		try {
			d.setDateProceSales(formato.parse(dt.getDateProceSales()+" 00:00:00"));
		} catch (ParseException e) {
			logger.error("Error colocando fecha 'procesales' en detalle para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		
		d.setPerPost(dt.getPerPost());
		
		try {
			d.setNbrTurn(Integer.parseInt(dt.getNbrTurn()));
		} catch (Exception e) {
			d.setNbrTurn(0);
			logger.error("Error colocando 'nbrTurn' en detalle para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		
		
		d.setNbrSide(dt.getNbrSide());
		
		try{
			d.setPorcentTaxIgv(new BigDecimal(dt.getPorcentTaxIgv().trim()));			
		}catch(Exception e){
			d.setPorcentTaxIgv(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor porcentTaxIgv , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		try{
			d.setTotalPen(new BigDecimal(dt.getTotalPen().trim()));
		}catch(Exception e){
			d.setTotalPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor totalPen , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		try{
			d.setTaxPen(new BigDecimal(dt.getTaxPen().trim()));
		}catch(Exception e){
			d.setTaxPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor TaxPen , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		d.setStkItem(dt.getStkItem());
		
		try{
			d.setSlsPrice(new BigDecimal(dt.getSlsPrice()));			
		}catch(Exception e){
			d.setSlsPrice(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor slsPrice , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		try{
			d.setSlsPriceSale(new BigDecimal(dt.getSlsPriceSale().trim()));
		}catch(Exception e){
			d.setSlsPriceSale(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor slsPriceSale , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		try{
			d.setStdCostPen(new BigDecimal(dt.getStdCostPen().trim()));			
		}catch(Exception e){
			d.setStdCostPen(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor stdCostPen , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}	
		
		d.setDescrInventory(dt.getDescrInventory());
		
		try{
			d.setQty(new BigDecimal(dt.getQty().trim()));			
		}catch(Exception e){
			d.setQty(new BigDecimal(numeroNulo));
			logger.error("Error seteando el valor Qty , se seteo el valor por defecto ("+numeroNulo+") :"+e.getMessage());
		}
		
		d.setUserId(dt.getUserId().trim());
		
		return d;
	}

	public static GlpVentaOpSalesCard generarDboGlpVentaOpSalesCard(GlpVenta vta,GlpRegistroVentaSalesCard sc){
		SimpleDateFormat formato = new SimpleDateFormat(fechaHora);
		GlpVentaOpSalesCard s = new GlpVentaOpSalesCard();
		
		s.setIdVenta(vta.getIdVenta());
		s.setDocTypeId(sc.getDocTypeId());
		s.setNbrDocument(sc.getNbrDocument());
		s.setSiteId(sc.getSiteId());
		
		try{
			s.setSequence(Integer.parseInt(sc.getSequence()));
		}catch(NumberFormatException nfe){
			logger.error("Error colocando sequence en opsalescard para la venta "+vta.getIdVenta()+" ("+nfe.getMessage()+")");
			s.setSequence(-1);
		}
		
		s.setCardId(sc.getCardId());
		s.setNbrCard(sc.getNbrCard());
		
		try{
			s.setTotCardPen(new BigDecimal(sc.getTotCardPen().trim()));			
		}catch(Exception e){
			s.setTotCardPen(new BigDecimal(numeroNulo));
			logger.error("Error colocando totcardPen en opsalescard para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		
		
		try {
			s.setDateProceSales(formato.parse(sc.getDateProceSales().trim()+" 00:00:00"));
		} catch (ParseException e) {
			logger.error("Error colocando fecha en opsalescard para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		return s;
	}
	
	public static GlpVentaOpDocAnti generarDboGlpVentaOpDocAnti(GlpVenta vta,GlpRegistroVentaDocAnti a){
		SimpleDateFormat formato = new SimpleDateFormat(fechaHora);
		GlpVentaOpDocAnti d = new GlpVentaOpDocAnti();
		d.setIdVenta(vta.getIdVenta());
		d.setDocTypeId(a.getDocTypeId());
		d.setNbrDocument(a.getNbrDocument());
		d.setSiteId(a.getSiteId());
		try {
			d.setDateProce(formato.parse(a.getDateProce().trim()+" 00:00:00"));
		} catch (ParseException e) {
			logger.error("Error colocando fecha en opdocanti para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		return d;
	}
	
	public static GlpVentaOpBonus generarDboGlpVentaOpBonus(GlpVenta vta,GlpRegistroVentaOpBonus b){
		SimpleDateFormat formato = new SimpleDateFormat(fechaHora);
		GlpVentaOpBonus n = new GlpVentaOpBonus();
		n.setIdVenta(vta.getIdVenta());
		n.setDocTypeId(b.getDocTypeId());
		n.setNbrDocument(b.getNbrDocument());
		n.setSiteId(b.getSiteId());
		n.setCustIdss(b.getCustIdss());
		n.setNbrBonus(b.getNbrBonus());
		try{
			n.setDateProceSales(formato.parse(b.getDateProceSales().trim()+" 00:00:00"));	
		}catch(ParseException e){
			logger.error("Error colocando fecha en opbonus para la venta "+vta.getIdVenta()+" ("+e.getMessage()+")");
		}
		return n;
	}
}
